package es.srn.utils.plantillas;
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */



import java.io.File;
import java.io.IOException;
import java.util.Arrays;
import java.util.Date;
import java.util.List;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.OutputKeys;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.Attr;
import org.w3c.dom.Comment;


/**
 *
 * @author Administrador
 */
public class ClsXml {
    
    private static Document cargarDocument(String path) throws IOException, SAXException{               
        Document doc = null;
        
        try {
                DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
                DocumentBuilder db = dbf.newDocumentBuilder();
                doc = db.parse(new File(path));
                doc.getDocumentElement().normalize();
        } catch (ParserConfigurationException | SAXException | IOException e) {
            e.printStackTrace();
            return null;
        }
              
        return doc;               
    }
    
    /*
    public static ClsPersonajes personajeFromXml(String path)
    {
        Document doc;
        
        try {
             doc = cargarDocument(path);
         } catch (IOException ex) {
             //Logger.getLogger(Proyecto1.class.getName()).log(Level.SEVERE, null, ex);
             return null;
         } catch (SAXException ex) {
             //Logger.getLogger(Proyecto1.class.getName()).log(Level.SEVERE, null, ex);
             return null;
         }
        
        NodeList nodosRaiz = doc.getElementsByTagName("root");        
        
        Node primerNodo = nodosRaiz.item(0);
        Element primerElemento = (Element) primerNodo;        
        //Atributos
        String identificador = primerElemento.getAttribute("id");
        String version = primerElemento.getAttribute("version");        
        //tags
        String avatar = getTagValue("Avatar", primerElemento);
        String nombre = getTagValue("Nombre", primerElemento);
        String fechaCreacion = getTagValue("FechaCreacion", primerElemento);
        String fechaModificacion = getTagValue("FechaModificacion", primerElemento);
        String vida = getTagValue("Vida", primerElemento);
        String accion = getTagValue("Accion", primerElemento);
        String disparo = getTagValue("Disparo", primerElemento);
        String combate = getTagValue("Combate", primerElemento);
        String musculos = getTagValue("Musculos", primerElemento);
        
        ClsPersonajes personaje = new ClsPersonajes(
                identificador,
                version.toString(), 
                new Date(), 
                new Date(),                  
                nombre,
                Integer.parseInt(accion), 
                Integer.parseInt(vida), 
                Integer.parseInt(disparo),
                Integer.parseInt(combate),
                Integer.parseInt(musculos),
                avatar
                );
        
        return personaje;
      
    }    
    public static ClsArmas armaFromXml(String path)
    {
        Document doc;
        
        try {
             doc = cargarDocument(path);
         } catch (IOException ex) {
             //Logger.getLogger(Proyecto1.class.getName()).log(Level.SEVERE, null, ex);
             return null;
         } catch (SAXException ex) {
             //Logger.getLogger(Proyecto1.class.getName()).log(Level.SEVERE, null, ex);
             return null;
         }
        
        NodeList nodosRaiz = doc.getElementsByTagName("root");        
        
        Node primerNodo = nodosRaiz.item(0);
        Element primerElemento = (Element) primerNodo;        
        
        //Atributos
        String identificador = primerElemento.getAttribute("id");
        String version = primerElemento.getAttribute("version");        
        //tags
        String avatar = getTagValue("Avatar", primerElemento);
        String nombre = getTagValue("Nombre", primerElemento);
        String fechaCreacion = getTagValue("FechaCreacion", primerElemento);
        String fechaModificacion = getTagValue("FechaModificacion", primerElemento);
        String costeAccion = getTagValue("CosteAccion", primerElemento);
        String alcance = getTagValue("Alcance", primerElemento);
        String cadencia = getTagValue("Cadencia", primerElemento);
        String musculos = getTagValue("Musculos", primerElemento);        
        String sumaMusculos = getTagValue("SumaAMusculos", primerElemento);
        String dosManos = getTagValue("DosManos", primerElemento);
        
        ClsArmas arma = new ClsArmas(
                identificador.toString(),
                version.toString(), 
                new Date(), 
                new Date(),                  
                nombre,
                Integer.parseInt(costeAccion), 
                Integer.parseInt(alcance), 
                Integer.parseInt(cadencia),                
                Integer.parseInt(musculos), 
                Boolean.parseBoolean(sumaMusculos),
                Boolean.parseBoolean(dosManos),
                avatar
                 );        
        
        return arma;        
        
    } 
    
    public static void personajeToXml()
    {       
        try {
 
		DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
		DocumentBuilder docBuilder = docFactory.newDocumentBuilder();
                 
		//Root elements
		Document doc = docBuilder.newDocument();
                
                
		Element rootElement = doc.createElement("root");
		doc.appendChild(rootElement);
                
                //Añadimos los atributos del id y de la version
                Attr attrId = doc.createAttribute("id");
                attrId.setValue("1");
                Attr attrVersion = doc.createAttribute("version");
                attrVersion.setValue("2");
                rootElement.setAttributeNode(attrId);
                rootElement.setAttributeNode(attrVersion);
      	
                List<String> elementos = Arrays.asList
                        ("Avatar", "Nombre", "FechaCreacion", 
                        "FechaModificacion","Vida","Accion",
                        "Disparo","Combate","Musculos");
                
                List<String> comentarios = Arrays.asList
                        ("Nombre Imagen", "Nombre visible", "Fecha de la creación del personaje", 
                        "Fecha de la modificación del personaje","CARACTERISTICAS: Vida del personaje","Numero de movimientos máximo",
                        "Armas de fuego. Numero de dados para impactar (daño el arma)","CPC. Dados para Impactar","CPC. Dados para daño");
                
                Element elemento;
                Comment comentario;
                
                for(int i = 0; i < elementos.size(); i++){
                    elemento = doc.createElement(elementos.get(i));
                    elemento.appendChild(doc.createTextNode(String.valueOf(i)));
                    rootElement.appendChild(elemento);
                    comentario = doc.createComment(comentarios.get(i));
                    elemento.getParentNode().insertBefore(comentario, elemento);                    
                }
                 
		// write the content into xml file
		TransformerFactory transformerFactory = TransformerFactory.newInstance();
		Transformer transformer = transformerFactory.newTransformer();
		DOMSource source = new DOMSource(doc);
                                
		
                //StreamResult result = new StreamResult(new File("C:\\file.xml"));
 
		// Output to console for testing
		StreamResult result = new StreamResult(System.out);
 
                transformer.setOutputProperty(OutputKeys.ENCODING, "iso-8859-1");
		transformer.transform(source, result);
 
		System.out.println("File saved!");
 
	  } catch (ParserConfigurationException pce) {
		pce.printStackTrace();
	  } catch (TransformerException tfe) {
		tfe.printStackTrace();
	  }
        
    }
            
    public static void armaToXml(ClsArmas arma)
    {        
        try {
 
		DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
		DocumentBuilder docBuilder = docFactory.newDocumentBuilder();
                 
		//Root elements
		Document doc = docBuilder.newDocument();
                                
		Element rootElement = doc.createElement("root");
		doc.appendChild(rootElement);
                
                //Añadimos los atributos del id y de la version
                Attr attrId = doc.createAttribute("id");
                attrId.setValue(arma.getId().toString());
                
                Attr attrVersion = doc.createAttribute("version");
                attrVersion.setValue(arma.getVersion().toString());
                
                rootElement.setAttributeNode(attrId);
                rootElement.setAttributeNode(attrVersion);
      	
                List<String> elementos = Arrays.asList
                        ("Avatar", "Nombre", "FechaCreacion","FechaModificacion",
                        "CosteAccion","Alcance","Cadencia","Musculos",
                        "SumaAMusculos","DosManos");
                
                List<String> comentarios = Arrays.asList
                        ("Nombre Imagen", "Nombre visible", "Fecha de la creación del personaje","Fecha de la modificación del personaje","CARACTERISTICAS: Vida del personaje","Numero de movimientos máximo",
                        "Coste de accion del arma","Alcance del arma","N de dados para impacto por accion", "N dados de daño por impacto",
                        "Daño suma a musculos del personaje", "Arma a dos manos (una por personaje)");
                
                Element elemento;
                Comment comentario;
                
                for(int i = 0; i < elementos.size(); i++){
                    elemento = doc.createElement(elementos.get(i));
                    elemento.appendChild(doc.createTextNode(String.valueOf(i)));
                    rootElement.appendChild(elemento);
                    comentario = doc.createComment(comentarios.get(i));
                    elemento.getParentNode().insertBefore(comentario, elemento);                    
                }
                                 
		// write the content into xml file
		TransformerFactory transformerFactory = TransformerFactory.newInstance();
		Transformer transformer = transformerFactory.newTransformer();
		DOMSource source = new DOMSource(doc);
                
                //StreamResult result = new StreamResult(new File("C:\\file.xml"));
 
		// Output to console for testing
		StreamResult result = new StreamResult(System.out);
 
                transformer.setOutputProperty(OutputKeys.ENCODING, "iso-8859-1");
		transformer.transform(source, result);
 
		System.out.println("File saved!");
 
	  } catch (ParserConfigurationException pce) {
		pce.printStackTrace();
	  } catch (TransformerException tfe) {
		tfe.printStackTrace();
	  }
    }
    */        
    private static String getTagValue(String tag, Element elemento) {
 
        NodeList lista = elemento.getElementsByTagName(tag).item(0).getChildNodes(); 
        
        if(lista.item(0) == null){
            //System.out.println("lista.item(0) es null");
            return "";
        }
        else{
            Node valor = (Node) lista.item(0);
            return valor.getNodeValue().toString();
        }        
    }    
}
